package com.huyun.web.concurrency.atomic;

import com.huyun.web.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicReference;

@Slf4j
@ThreadSafe
public class AtomicExample4 {
    /**
     * AtomicReference 所提供的某些方法可以进行原子性操作，如compareAndSet、getAndSet，
     * 这仅仅是对引用进行原子性操作
     * AtomicReference  不能保证对象中若存在属性值修改是线程安全的，如假设引用对象是person，
     * 修改person中name和age，多个线程同时从引用中获得对象，并进行修改，会出现线程不安全情况。
     * 下面我们通过代码来验证一下这条结论。
     * 在AtomicReferenceTest 中测试了在高并发的情况下不是源自操作
     */

    private static AtomicReference<Integer> count = new AtomicReference<>(0);

    public static void main(String[] args) {
        count.compareAndSet(0, 2); // 2
//        count.compareAndSet(0, 1); // no
//        count.compareAndSet(1, 3); // no
        count.compareAndSet(2, 4); // 4
//        count.compareAndSet(3, 5); // no
        log.info("count:{}", count.get());
    }
}
